home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 14 / CU Amiga Magazine's Super CD-ROM 14 (1997)(EMAP Images)(GB)(Track 1 of 3)[!][issue 1997-09].iso / CUCD / Programming / XPK / Source / xpkmaster / query.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-06-09  |  4.6 KB  |  186 lines

  1. #ifndef XPKMASTER_QUERY_C
  2. #define XPKMASTER_QUERY_C
  3.  
  4. /* Routinesheader
  5.  
  6.     Name:        query.c
  7.     Main:        xpkmaster
  8.     Versionstring:    $VER: query.c 1.4 (09.06.97)
  9.     Author:        SDI
  10.     Distribution:    PD
  11.     Description:    Implementation of XpkQuery
  12.  
  13.  1.0   06.10.96 : first real version
  14.  1.1   27.12.96 : removed 1.3 specific functions
  15.  1.2   09.03.97 : added USER mode
  16.  1.3   31.03.97 : made tag processing better, nearly rewritten all, removed
  17.      goto's this way
  18.  1.4   09.06.97 : fixed Enforcer hit, when library opening failed
  19. */
  20.  
  21. #include <exec/types.h>
  22. #include <exec/memory.h>
  23. #include <pragma/exec_lib.h>
  24. #include <pragma/dos_lib.h>
  25. #include <dos/dos.h>
  26. #include "xpkmaster.h"
  27. #include "xpk_strings.h"
  28.  
  29. /************************************************************************
  30.  *
  31.  *  Information query
  32.  *
  33.  */
  34.  
  35. static struct XpkMode USERMode = { 0,100,0,0,0,0,0,0,0,"user"};
  36.  
  37. static struct XpkInfo USERInfo = { 1,0,0,1,"USER","User",
  38. 0, 0x55534552, XPKIF_PK_CHUNK|XPKIF_UP_CHUNK, 50000, 10, 50000,
  39. 0,0,0,0,100,0,&USERMode,0,0,0,0,0,0};
  40.  
  41. #ifdef __cplusplus
  42.   extern "C"
  43. #endif
  44.  
  45. LONG __asm LIBXpkQuery(register __a0 struct TagItem *ti)
  46. {
  47.   struct TagItem    *tags = ti;
  48.   STRPTR        packmethod = 0,
  49.               errtext = 0;
  50.   ULONG            packmode = 0,
  51.               prefs = 1; /* use prefs, default is true */
  52.   LONG            error = 0;
  53.   struct XpkPackerInfo *pinfo = 0;
  54.   struct XpkPackerList *plist = 0;
  55.   struct XpkMode *    pmode = 0;
  56.   struct Library *    XpkSubBase = 0;
  57.   struct XpkInfo *    sinfo = 0;
  58.   UBYTE            libname[] = "compressors/xpk____.library";
  59.  
  60. #ifdef DEBUG
  61.   DebugTagList("XpkQuery", tags);
  62. #endif
  63.  
  64.   while((ti = NextTagItem(&tags)))
  65.   {
  66.     switch(ti->ti_Tag)
  67.     {
  68.     case XPK_PackersQuery: plist = (struct XpkPackerList *) ti->ti_Data;
  69.       break;
  70.     case XPK_ModeQuery: pmode = (struct XpkMode *) ti->ti_Data; break;
  71.     case XPK_PackerQuery: pinfo = (struct XpkPackerInfo *) ti->ti_Data;
  72.       break;
  73.     case XPK_PackMethod: packmethod = (STRPTR) ti->ti_Data; break;
  74.     case XPK_PackMode: packmode = ti->ti_Data; break;
  75.     case XPK_GetError: errtext = (STRPTR) ti->ti_Data; break;
  76.     case XPK_Preferences: prefs = ti->ti_Data; break;
  77.     };
  78.   }
  79.  
  80.   if(packmethod)
  81.   {
  82.     libname[15] = toupper(packmethod[0]);
  83.     libname[16] = toupper(packmethod[1]);
  84.     libname[17] = toupper(packmethod[2]);
  85.     libname[18] = toupper(packmethod[3]);
  86.  
  87.     if(strnicmp("USER", libname+15, 4))
  88.     {
  89.       if(!(XpkSubBase = OpenLibrary(libname, 0)) ||
  90.       !(sinfo = XpksPackerInfo()))
  91.         error = XPKERR_MISSINGLIB;
  92.     }
  93.     else
  94.     {
  95.       sinfo = &USERInfo;
  96.       sinfo->xi_Description = strings[TXT_USER_DESCRIPTION];
  97.     }
  98.   }
  99.  
  100.   if(!error)
  101.   {
  102.     if(plist)
  103.     {
  104.       struct FileInfoBlock *fib;
  105.  
  106.       if(!(fib = (struct FileInfoBlock *) AllocDosObject(DOS_FIB, 0)))
  107.         error = XPKERR_NOMEM;
  108.       else
  109.       {
  110.         ULONG lock;
  111.  
  112.         memset(plist, 0, sizeof(struct XpkPackerList));
  113.         if(!(lock = Lock("libs:compressors", ACCESS_READ)))
  114.           error = XPKERR_NOINFO;
  115.         else
  116.         {
  117.           if(!Examine(lock, fib) || fib->fib_DirEntryType < 0)
  118.             error = XPKERR_NOINFO;
  119.       else
  120.       {
  121.         while(ExNext(lock, fib))
  122.         {
  123.           if(!strncmp("xpk", fib->fib_FileName, 3) &&
  124.               !strcmp(".library", fib->fib_FileName+7))
  125.           {
  126.             ULONG ID = idfromname(fib->fib_FileName+3), i;
  127.  
  128.             for(i = plist->xpl_NumPackers; i > 0 &&
  129.             *(ULONG *) plist->xpl_Packer[i - 1] > ID; i--)
  130.           *(ULONG *) plist->xpl_Packer[i] =
  131.           *(ULONG *) plist->xpl_Packer[i-1];
  132.             *(ULONG *) plist->xpl_Packer[i] = ID;
  133.  
  134.             if(++plist->xpl_NumPackers == MAXPACKERS)
  135.           break;
  136.           }
  137.         }
  138.         if(prefs) /* add USER mode */
  139.         {
  140.           if(plist->xpl_NumPackers == MAXPACKERS)
  141.             --plist->xpl_NumPackers;
  142.               *(ULONG *) plist->xpl_Packer[plist->xpl_NumPackers++] = 0x55534552;
  143.             }
  144.           }
  145.           UnLock(lock);
  146.         }
  147.         FreeDosObject(DOS_FIB, fib);
  148.       }
  149.     }
  150.     else if(pinfo)
  151.     {
  152.       sprintf(pinfo->xpi_Name, sinfo->xi_Name);
  153.       sprintf(pinfo->xpi_LongName, sinfo->xi_LongName);
  154.       sprintf(pinfo->xpi_Description, sinfo->xi_Description);
  155.       pinfo->xpi_Flags = sinfo->xi_Flags;
  156.       pinfo->xpi_MaxChunk = sinfo->xi_MaxPkInChunk;
  157.       pinfo->xpi_DefChunk = sinfo->xi_DefPkInChunk;
  158.       pinfo->xpi_DefMode = sinfo->xi_DefMode;
  159.     }
  160.     else if(pmode)
  161.     {
  162.       struct XpkMode* m = sinfo->xi_ModeDesc;
  163.       while(m && m->xm_Upto < packmode)
  164.         m = m->xm_Next;
  165.  
  166.       if(!m)
  167.         error = XPKERR_NOINFO;
  168.       else
  169.         CopyMem(m, pmode, sizeof(struct XpkMode));
  170.     }
  171.     else
  172.       error = XPKERR_BADPARAMS;
  173.   }
  174.  
  175.   if(errtext)
  176.     sprintf(errtext, XpkErrs[-error]);
  177.  
  178.   if(XpkSubBase)
  179.     CloseLibrary(XpkSubBase);
  180.  
  181.   return error;
  182. }
  183.  
  184. #endif /* XPKMASTER_QUERY_C */
  185.  
  186.